// 条款51：编写new和delete时需固守常规

// 核心概念
// 条款51讨论了在编写自定义的operator new和operator delete时应该遵循的规则和惯例。虽然前面的条款讨论了何时替换这些操作符，但这一条款关注的是如何正确实现它们。

// 实现operator new的规则
// 1. 返回正确的值
//      成功时返回指向分配内存的指针
//      内存不足时返回空指针（nothrow版本）或抛出std::bad_alloc异常（标准版本）

// 2. 处理零字节请求
// 即使请求0字节的内存，也应该返回一个合法的指针：
void *operator new(std::size_t size) throw(std::bad_alloc)
{
    if (size == 0)
    {
        size = 1; // 确保分配至少1字节
    }

    void *ptr = malloc(size);
    if (ptr == nullptr)
    {
        throw std::bad_alloc();
    }

    return ptr;
}

